/**
 * 区划管理
 */
export default {
  /**
   * 区划配置信息管理
   */
  regionCatalog: {
    // 所有区划配置信息
    regionCatalogs: [],
    // 当前使用的的区划配置信息
    currRegionCatalog: {},
    /**
     * 设置区划配置信息
     * @param {Array} regionCatalogsParm 区划配置信息
     *    [{"id","","analysis_service":"","data_service":"","query_service":"",
     *    "tdlayer_service":"","sdlayer_service","data_source":"数据源名称","name":"","year":""}]
     */
    setRegionCatalogs(regionCatalogsParm) {
      this.regionCatalogs = regionCatalogsParm;
      this.currRegionCatalog = regionCatalogsParm[0];
    },
    /**
     * 获取所有区划配置信息
     */
    getRegionCatalogs() {
      return this.regionCatalogs;
    },
    /**
     * 获取当前正在使用的区划配置信息
     */
    getCurrRegionCatalog() {
      return this.currRegionCatalog;
    },
    /**
     * 获取当前使用的地图服务地址
     */
    getCurrQueryService() {
      return this.currRegionCatalog.query_service;
    },
    /**
     * 获取当前使用的数据服务地址
     */
    getCurrDataService() {
      return this.currRegionCatalog.data_service;
    },
    /**
     * 获取当前使用的分析服务地址
     */
    getCurrAnalysisService() {
      return this.currRegionCatalog.analysis_service;
    },
    /**
     * 获取三维地图服务地址
     */
    getCurrTDLayerService() {
      return this.currRegionCatalog.tdlayer_service;
    },
    /**
     * 获取二维度地图服务地址
     */
    getCurrSDLayerService() {
      return this.currRegionCatalog.sdlayer_service;
    },
    /**
     * 获取去当前区划的数据源
     */
    getCurrDataSource() {
      return this.currRegionCatalog.data_source;
    }
  },
  regionInfos: {
    // 当前选中的区划，可以是多个区划，所有区划必须是统一级别的
    // [{"id":"","rcid":"","regioncode":"","regionname":"","regiontype":"","regionlevel":"","origincode":"","parcode":"","lat":"","lon":"","rname":"","pname":""}]
    currentRegionInfos: [],
    // 当前行政区划级别
    currentRegionLevel: 0,
    // 获取允许的最大行政区划级别
    maxRegionLevel: 0,
    // 当前选中区划缩放范围（leaflet L.latLngBounds(points)）
    currentRegionBounds: null,
    /**
     * 设置当前选中的行政区划
     */
    setCurrentRegionInfos(currentRegionInfos) {
      if (
        !currentRegionInfos ||
        currentRegionInfos === null ||
        currentRegionInfos.length < 1
      ) {
        return;
      }
      this.currentRegionInfos = currentRegionInfos;
      // 因为都是同一级别的区划，只获取第一个区划的区划等级就可以
      this.currentRegionLevel = this.currentRegionInfos[0].regionlevel;
    },
    /**
     * 获取当前行政区划
     * 此处设置来的区划信息，可能来源有多重选择区划树、空间查询、缓冲分析等，
     * 因此使用的时候需要判断一下需要的数据有没有，没有的话直接到后台查询补全
     */
    getCurrentRegionInfos() {
      return this.currentRegionInfos;
    },
    getCurrentRegionLevel() {
      return this.currentRegionLevel;
    },
    /**
     * 获取最大行政区划级别
     */
    getMaxLevel() {
      return this.maxRegionLevel;
    },
    /**
     * 获取当前行政区划
     */
    getCurrentRegionCodes() {
      if (
        !currentRegionInfos ||
        currentRegionInfos === null ||
        currentRegionInfos.length < 1
      ) {
        return [];
      }
    }
  },
  /**
   * 区划工具
   */
  regionUtils: {
    municipalityRegions: ["11", "12", "31", "50"],
    /**
     * 获取区划代码对应的区划等级
     * @param {String} regionCode 区划代码
     */
    getRegionLevel(regionCode) {
      let regionlevel = -1;
      // 此处判断需要12位完整区划
      if (regionCode.length === 12) {
        if (regionCode === "000000000000") {
          regionlevel = 1;
        } else if (regionCode.toString().lastIndexOf("0000000000") !== -1) {
          regionlevel = 2;
          // 市
        } else if (regionCode.toString().lastIndexOf("00000000") !== -1) {
          regionlevel = 3;
          // 区县
        } else if (regionCode.toString().lastIndexOf("000000") !== -1) {
          regionlevel = 4;
          // 乡镇
        } else if (regionCode.toString().substring(9, 12) === "000") {
          regionlevel = 5;
        } else {
          // 村
          regionlevel = 6;
        }
      }
      // 如果行政区划需要特殊判断的，后续在这里加入
      return regionlevel;
    },
    /**
     * 获取区划代码对应的区划等级名称
     * @param {String} regionCode 区划代码
     */
    getRegionLevelName(regionCode) {
      regionCode = regionCode.replace(/_/g, "0");
      if (regionCode === "000000000000") {
        return "全国";
      } else {
        switch (this.getRegionLevel(regionCode)) {
          case 2:
            return "省";
          case 3:
            return "市";
          case 4:
            return "区县";
          case 5:
            return "街道乡镇";
          case 6:
            return "村居委会";
          default:
            return "";
        }
      }
    },
    getDataSetNameByRegionLevel(regionlevel) {
      switch (regionlevel) {
        case 1:
          return "ST_R_WD";
        case 2:
          return "ST_R_SN";
        case 3:
          return "ST_R_SH";
        case 4:
          return "ST_R_XN";
        case 5:
          return "ST_R_XA";
        case 6:
          return "ST_R_CN";
        case 7:
          return "ST_R_XQ";
        default:
          return "";
      }
    },
    /**
     * 对比区划代码的区划等级是否一致
     * @param {String} sourceRegionCode 被对比的区划代码
     * @param {String} targetRegionCode  要对比的区划代码
     */
    isSameLevel(sourceRegionCode, targetRegionCode) {
      return (
        this.getRegionLevel(sourceRegionCode) ===
        this.getRegionLevel(targetRegionCode)
      );
    },
    /**
     * 获取区划代码右侧有效部分
     * @param {String} regionCode 区划代码
     */
    getPrefixCode(regionCode) {
      let prefixCode = "";
      if (regionCode.indexOf("#") !== -1) {
        return regionCode.substring(0, regionCode.indexOf("#"));
      }
      if (this.getRegionLevel(regionCode) === 1) {
        prefixCode = "000000000000";
      } else if (this.getRegionLevel(regionCode) === 2) {
        prefixCode = regionCode.toString().substring(0, 2);
      } else if (this.getRegionLevel(regionCode) === 3) {
        prefixCode = regionCode.toString().substring(0, 4);
      } else if (this.getRegionLevel(regionCode) === 4) {
        prefixCode = regionCode.toString().substring(0, 6);
      } else if (this.getRegionLevel(regionCode) === 5) {
        prefixCode = regionCode.toString().substring(0, 9);
      } else if (this.getRegionLevel(regionCode) === 6) {
        prefixCode = regionCode.toString().substring(0, 12);
      }
      return prefixCode;
    },
    /**
     * 根据区划等级获取有效区划截取
     */
    getSubCode(regioncode, regionlevel) {
      switch (regionlevel) {
        case 1:
          return "";
        case 2:
          return regioncode.substring(0, 2);
        case 3:
          return regioncode.substring(0, 4);
        case 4:
          return regioncode.substring(0, 6);
        case 5:
          return regioncode.substring(0, 9);
        case 6:
          return regioncode.substring(0, 12);
        case 7:
          return regioncode.substring(0, 14);
        case 8:
          return regioncode.substring(0, 29);
        case 9:
          return regioncode.substring(0, 10);
        default:
          return regioncode;
      }
    },
    /**
     * 区划代码补0，构造成12位标准区划代码
     * @param {String} prefixCode 区划代码右侧有效代码
     */
    toStandardCode(prefixCode) {
      while (prefixCode.length < 12) {
        prefixCode += "0";
      }
      return prefixCode;
    },
    /**
     * 构建 ##** 区划代码
     * @param {String} level 区划等级
     * @param {String } regioncode 区划代码
     */
    caluMacRegion(level, regioncode) {
      let prec = "";
      let code = "";
      if (regioncode.indexOf("|") !== -1) {
        let codes = regioncode.split("\\|");
        let len = 12;
        for (let i = 0, size = codes.length; i < size; i++) {
          let tlen = codes[i].length;
          if (tlen < len) {
            code = codes[i];
            len = tlen;
          }
        }
      } else {
        code = regioncode;
      }
      if (code !== "") {
        switch (level) {
          case "1":
            return "##0000000000";
          case "2":
            return code.substring(0, 2) + "0000000000";
          case "3":
            return code.substring(0, 2) + "##00000000";
          case "4":
            prec = code.substring(0, 4);
            if (prec.length === 2) {
              return prec + "##**000000";
            } else {
              return prec + "##000000";
            }
          case "5":
            prec = code.substring(0, 6);
            if (prec.length === 2) {
              return prec + "##*****000";
            } else if (prec.length === 4) {
              return prec + "##000000";
            } else {
              return prec + "###000";
            }
          case "6":
            prec = code.substring(0, 9);
            if (prec.length === 2) {
              return prec + "##*****000";
            } else if (prec.length === 4) {
              return prec + "##000000";
            } else if (prec.length === 6) {
              return prec + "###000";
            } else {
              return prec + "###";
            }
        }
      } else {
        switch (level) {
          case "1":
            return "##0000000000";
          case "2":
            return "##0000000000";
          case "3":
            prec = userRegion.substring(0, 2);
            if (prec === "00") {
              return "##**00000000";
            } else {
              return prec + "##00000000";
            }
          case "4":
            prec = userRegion.substring(0, 4);
            if (prec === "0000") {
              return "##**##000000";
            } else {
              return prec + "##000000";
            }
          case "5":
            prec = userRegion.substring(0, 6);
            if (prec === "000000") {
              return "##*******000";
            } else {
              return prec + "###000";
            }
          case "6":
            prec = userRegion.substring(0, 9);
            return prec + "###";
        }
      }
    },
    /**
     * 判断区划是否为直辖市
     * @param {String} regionCode 区划代码
     */
    isMunicipality(regionCode) {
      let flag = false;
      if (
        this.municipalityRegions.indexOf(
          regionCode.substring(0, 2).toString()
        ) > -1
      ) {
        flag = true;
      }
      return flag;
    },
    /**
     * 将行政区划信息转换成行政区划代码数组
     * @param {Object} regionInfos 行政区划信息数组
     */
    getRegionCodesByRegionInfos(regionInfos) {
      if (!regionInfos || regionInfos === null) {
        return [];
      }
      let regionCodes = [];
      for (let i = 0, len = regionInfos.length; i < len; i++) {
        let temp = regionInfos[i];
        regionCodes.push(temp.regioncode);
      }
      return regionCodes;
    }
  },
  userRegion: {}
};
